/*
 * @Author: your name
 * @Date: 2021-07-06 16:27:57
 * @LastEditTime: 2021-07-26 11:49:44
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \cuiyuan_activity\assets\script\Game.ts
 */
// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html


import { sceneData, formData } from "DataModule";

import { scenes, CELL_TIME, STEP, DesignWidth } from "./Data";
import Game from "./Game";
const { ccclass, property } = cc._decorator;
import { getStore, setStore } from "./Utils";


@ccclass
export default class SceneContent extends cc.Component {
    static inst: SceneContent;
    // 场景
    @property(cc.Node)
    move_scene: cc.Node = null;//移动的场景
    sceneDatas: sceneData[] = [];// 场景用到的资源
    sceneNodes: cc.Node[] = []; // 移动场景的集合
    moveStatus: number = 0; // 初始化为0 移动为1 暂停为2 结束为3
    totalIndex: number = 0;

    // 每个场景的预制体
    @property(cc.Prefab)
    scene_1: cc.Prefab[] = null;
    @property(cc.Prefab)
    scene_2: cc.Prefab = null;
    @property(cc.Prefab)
    scene_3: cc.Prefab = null;
    @property(cc.Prefab)
    scene_4: cc.Prefab = null;
    @property(cc.Prefab)
    scene_5: cc.Prefab = null;
    @property(cc.Prefab)
    scene_6: cc.Prefab = null;
    @property(cc.Prefab)
    scene_7: cc.Prefab = null;
    @property(cc.Prefab)
    scene_8: cc.Prefab = null;
    @property(cc.Prefab)
    scene_9: cc.Prefab = null;
    @property(cc.Prefab)
    scene_10: cc.Prefab = null;
    @property(cc.Prefab)
    scene_11: cc.Prefab = null;
    @property(cc.Prefab)
    scene_12: cc.Prefab = null;
    @property(cc.Prefab)
    scene_13: cc.Prefab = null;

    // 音频
    @property(cc.AudioClip)
    fly: cc.AudioClip = null;

    // 播放按钮
    @property(cc.Node)
    ship: cc.Node = null;

    // 输入框和获取船票
    @property(cc.Node)
    apply: cc.Node = null; // 登记小火箭
    @property(cc.Node)
    start_btn: cc.Node = null; // 登记小火箭
    @property(cc.Node)
    form_input: cc.Node = null; // 提示框
    isInput: boolean = false; //判断用户是否输入
    submitData: formData = {
        name: '',
        hasChild: false,
        hasParent: false
    }

    // 逻辑需要
    currentIndex: number = -1; //当前播放的场景索引
    nowTime: number = 0;
    currentMusic = null;// 当前播放的音乐

    // 脚本
    Title = null;
    NavBar = null;
    Controller = null;


    onLoad() {
        SceneContent.inst = this;
        // 初始化获取数据
        this.sceneDatas = scenes;
        this.Title = cc.find('title', this.node).getComponent('Title')
        this.NavBar = cc.find('Canvas/NavBar').getComponent('NavBar')
        this.Controller = cc.find('play_btn', this.node).getComponent('Controller')
        this.init();
    }

    // 初始化组件
    init() {
        // 判断用户是否完成数据录入
        let submitData = getStore('submitData', true)
        if (submitData) {
            this.isInput = true;
            this.showStartBtn()
        } else {
            this.showApply();
        }

        // 加载所有节点，保存到数组中，并设置为隐藏模式 只显示第一个
        this.initScene();
    }

    // 初始化所有场景
    initScene() {
        this.sceneNodes = [];
        for (let i = 0; i < this.sceneDatas.length; i++) {
            let prefab: cc.Prefab = this[this.sceneDatas[i].scene];
            let scene = this.getSceneByPrefab(prefab)
            // 判断位置 后期调整该处的位置
            scene.x = i !== 0 ? (this.sceneNodes[i - 1].x + this.sceneNodes[i - 1].width) : -DesignWidth / 2;
            this.move_scene.width += scene.width;
            scene.parent = this.move_scene;
            this.sceneNodes.push(scene)
        }
    }

    // 开始移动查看
    startMove(showNav: boolean = true) {
        this.Title.show();
        switch (this.moveStatus) {
            case 0:
                this.controllScene(1, showNav, false, 'play')
                break;
            case 1:
                this.controllScene(2, showNav, false, 'pause', false)
                break;
            case 2:
                this.controllScene(1, false, false, 'play')
                break;
            case 3:
                this.move_scene.x = 0;
                this.controllScene(1, false, true, 'play')
                break;
        }
    }


    /**
     * @description 主场景控制
     * @param status 场景的移动状态
     * @param showNav 是否展示nav导航栏
     * @param stopMusic 是否停止场景音乐
     * @param title 红旗的按钮文字
     * @param showFlag 是否展示红旗
     */
    controllScene(status: number = 0, showNav: boolean = true, stopMusic: boolean = true, title: string = 'play', showFlag: boolean = true) {
        this.moveStatus = status;
        if (status === 3) {
            setStore('getTicket', true, false)
            this.hideShip()
        }
        showFlag ? this.Controller.show() : this.Controller.hide();
        showNav ? this.NavBar.show() : this.NavBar.hide();
        stopMusic ? this.stopMusic() : '';
        this.changePlayBtnText(title);
    }

    // 是否移动完毕
    isMoveOver() {
        if (this.move_scene.x <= -this.move_scene.width + DesignWidth) {
            return true;
        }
        return false;
    }

    /**
     * prefab生成节点
     * @param prefab 
     * @returns 
     */
    getSceneByPrefab(prefab: cc.Prefab) {
        return cc.instantiate(prefab);
    }

    /**
   * 
   * @description 音乐控制模块
   */

    // 停止播放音乐
    startMusic() {
        let index = this.currentIndex
        this.stopMusic()
        if (!this.sceneDatas[index].music) {
            Game.inst.setMainBgmVolume(1)
            return
        };
        let clip: cc.AudioClip = this[this.sceneDatas[index].music]
        Game.inst.setMainBgmVolume(0.3)
        this.currentMusic = cc.audioEngine.play(clip, false, 1);

    }

    // 开始播放音乐
    stopMusic() {
        if (this.currentMusic !== null) {
            cc.audioEngine.stop(this.currentMusic)
            this.currentMusic = null;
        };
    }

    /**
     * @description 加载场景的脚本 执行脚本内部动画
     * @param index 
     */
    initSceneScript(index: number) {
        let sceneName = this.sceneDatas[index].scene
        let Script = this.sceneNodes[index].getComponent(sceneName)
        if (Script) {
            Script.init()
        }
    }


    /**
     * 切换场景
     * @param index 
     */
    changePlayNode(index: number) {
        let scene = this.sceneNodes[index];
        this.currentMusic = null; //重置音乐
        this.move_scene.x = index === 0 ? 0 : -scene.x; // 需要做一定的优化处理
        this.currentIndex = index - 1; // 这里之所以减1 为了修复点击回看场景是，如果该场景存在音乐，无法播放音乐的bug
        this.moveStatus = 1;
        this.move_scene.active = true;
        this.NavBar.updateStatus();
        this.NavBar.hide();
        this.changePlayBtnText("pause")
        let controller = cc.find('play_btn', this.node).getComponent("Controller")
        controller.show();

    }

    /**
     * 获取当前屏幕上的场景序号
     * @param pox 当前移动场景的坐标
     * @returns 返回当前是第几个场景
     */
    getCurrentIndex(pox: cc.Vec2) {
        let moveX = Math.abs(pox.x);
        for (let i = this.sceneNodes.length - 1; i >= 0; i--) {
            let scene = this.sceneNodes[i]
            // 更新标题
            if (moveX >= scene.x && this.currentIndex !== i) {
                this.Title.init(this.sceneDatas[i]);
            }
            if (moveX >= scene.x + DesignWidth / 2) {
                return i;
            }
        }
    }

    /**
     * @description 控件模块
     * 
     */

    // 改变按钮的文字
    changePlayBtnText(status: string) {
        let controller = cc.find('play_btn', this.node).getComponent("Controller")
        controller.init(status);
    }

    // 展示开始按钮和飞船
    showFlagAndShip() {
        this.Controller.show()
        this.ship.active = true;
    }

    // 隐藏飞船
    hideShip() {
        this.ship.active = false;
    }
    // 隐藏申请按钮
    hideApply() {
        this.apply.active = false
    }

    // 展示申请的按钮
    showApply() {
        if (this.isInput) return
        this.apply.active = true;
    }

    // 点击apply小火箭触发的函数
    applyBtnClick() {
        let Form = cc.find('Form', this.node).getComponent('Form')
        Form.show();
        this.hideApply();
    }

    // 展示开始按钮
    showStartBtn() {
        this.start_btn.active = true;
    }

    hideStartBtn() {
        this.start_btn.active = false;
    }

    // 开始按钮触发的事件
    startBtnClick() {
        this.hideStartBtn()
        this.showFlagAndShip();
        this.startMove(false);
    }

    /**
     * 脚本初始化函数
     */


    show() {
        this.node.active = true;
    }
    hide() {
        this.node.active = false;
    }

    update(dt: number) {
        this.nowTime += dt;
        if (this.nowTime >= CELL_TIME) {
            this.fixedUpdate(CELL_TIME)
            this.nowTime -= CELL_TIME;
        }
    }

    // 优化游戏体验感
    /**
    * 移动的解决方案，创建一个空节点，用于承载所有的场景节点，并且场景节点已经是排好顺序的啦！只需要操作大节点
    */
    fixedUpdate(dt: number) {
        if (this.moveStatus === 1) {
            let index = this.getCurrentIndex(this.move_scene.getPosition());
            if (!this.isMoveOver()) {
                this.move_scene.x -= STEP
            } else {
                this.controllScene(3, false, true, 'pause', false) // 移动完毕执行
                // 移动完毕执行
            };
            //需要进行这一步的计算
            this.updateEvent(index) // 交互时间逻辑处理分发
            this.updateIndex(index)//更新索引的场景
            // 修改场景的标题文字
        }
        // 场景结束--优化处理
        let isEndPos = this.move_scene.x !== -(this.move_scene.width - DesignWidth)
        if (this.isMoveOver() && isEndPos) {
            this.move_scene.x = -(this.move_scene.width - DesignWidth)
        }
    }

    /**
     * @description 时间逻辑处理分发
     * @param index 
     */
    updateEvent(index: number) {
        if (this.currentIndex !== index) {

            // 播放背景音乐
            // this.startMusic(index)
            this.stopMusic();
            // 加载场景脚本
            this.initSceneScript(index);

        }
    }

    /**
     * @description 更新场景的索引
     * @param index 
     */
    updateIndex(index: number) {
        this.currentIndex = index;
        this.totalIndex = this.totalIndex <= this.currentIndex ? this.currentIndex : this.totalIndex;
    }


}
